package com.example.demoqrcode.service.impl;

import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.example.democommon.contasant.CommonConstant;
import com.example.demoqrcode.service.DemoQrCodeService;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.springframework.stereotype.Service;

import javax.imageio.ImageIO;
import java.awt.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @version 1.0.0
 * @className: DemoQrCodeServiceImpl
 * @description:
 * @author: zhangjunfa
 * @date: 2022/6/14 10:11
 */
@Service
public class DemoQrCodeServiceImpl implements DemoQrCodeService {
    /**
     * 根据content生成简单二维码
     *
     * @param content 可以是文字，也可以是域名（https://www.baidu.com/）
     * @return
     */
    @Override
    public byte[] getQrCode(String content) {
        QrConfig config = handleConfig(0, 0);
        return QrCodeUtil.generatePng(content, config);
    }

    /**
     * 根据content和logoUrl生成二维码图片
     *
     * @param content
     * @param logoUrl
     */
    @Override
    public byte[] getOrgCodeByLogo(String content, String logoUrl) throws IOException {
        QrConfig config = handleConfig(0, 0);
        if (StrUtil.isNotBlank(logoUrl)) {
            Image image = ImageIO.read(new URL(logoUrl));
            config.setImg(image);
        }
        return QrCodeUtil.generatePng(content, config);
    }

    /**
     * 生成Base64位的二维码
     *
     * @param content
     * @return
     */
    @Override
    public String getOrgCodeBase64(String content) {
        QrConfig config = handleConfig(0, 0);
        return QrCodeUtil.generateAsBase64(content, config, ImgUtil.IMAGE_TYPE_PNG);
    }

    /**
     * 处理二维码的配置
     *
     * @param width  二维码的宽,如果为空，则默认
     * @param height 二维码的高,如果为空，则默认
     * @return
     */
    private QrConfig handleConfig(int width, int height) {
        QrConfig config = new QrConfig();
        config.setWidth(width == 0 ? CommonConstant.DEFAULT_WIDTH : width);
        config.setHeight(height == 0 ? CommonConstant.DEFAULT_HEIGHT : height);
        // 设置边距，既二维码和背景之间的边距
        config.setMargin(3);
        // 设置前景色，既二维码颜色（青色）
        config.setForeColor(Color.BLACK);
        // 设置背景色（灰色）
        config.setBackColor(Color.WHITE);
        // 高纠错级别
        config.setErrorCorrection(ErrorCorrectionLevel.H);
        return config;
    }
}
